﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace _11_Task
{
    internal class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 3; i++)
            {
                Task task1 = new Task(DoWork);
                task1.Start();
            }

            //Task与Thread区别
            //1.Task是.net4.0之后提供的一个类，用于简化线程的使用。Thread是.net1.0就有的类
            //2.Task是基于线程池的，Thread是基于操作系统的

            //Thread每一次new Thread都会创建一个新的线程，而Task则是基于线程池的，每一次new Task都会从线程池中取一个线程来执行

            //什么是线程池?线程池是一个容器，里面存放着很多线程，这些线程都是空闲的，等待任务的到来，
            //一旦有任务到来，线程池就会分配一个线程给任务，任务执行完毕后，线程又会回到线程池中，等待下一个任务的到来
            //线程池当中的所有线程默认都是后台线程(Thread默认是前台线程，Task默认是后台线程)

            //Task的线程池默认有4个线程，当4个线程不够用的时候，才会创建新的线程
            //Task线程执行完毕后会回收线程资源，而Thread需要手动设置线程对象为NULL才可以通过GC回收

            //Task的三种启动方式
            //1.通过Task.Run()方法启动
            Task.Run(DoWork);
            
            //2.通过Task.Factory.StartNew()方法启动
            Task.Factory.StartNew(DoWork);
            
            //3.通过Task的构造函数启动
            Task task = new Task(DoWork);
            task.Start();

        }

        public static void DoWork()
        {
            for (int i = 0; i <= 10; i++)
            {
                //获取当前线程ID，打印输出
                Console.WriteLine("Thread-{0}:{1}", Thread.CurrentThread.ManagedThreadId, i);
                Thread.Sleep(1000);
            }
        }

    }
}
